#include "requestutils.h"

#include <QEventLoop>
#include <QJsonObject>
#include <QJsonParseError>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>
#include <QUrl>

RequestUtils::RequestUtils(QObject *parent)
    : QObject{parent}
{
}

// 同步发起HTTP GET请求并返回QJsonObject，带超时设置
QJsonObject RequestUtils::httpGetToJsonObject(const QString &urlString, int timeoutMs)
{
    QJsonObject resultObject;

    // 检查URL有效性
    QUrl url(urlString);
    if (!url.isValid())
    {
        qWarning() << "Invalid URL:" << urlString;
        resultObject["error"] = "Invalid URL";
        return resultObject;
    }

    // 创建网络访问管理器
    QNetworkAccessManager manager;
    manager.setNetworkAccessible(QNetworkAccessManager::Accessible);
    QNetworkRequest request(url);

    // 设置请求头
    request.setHeader(QNetworkRequest::UserAgentHeader,
                      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    // 发起GET请求
    QNetworkReply *reply = manager.get(request);

    // 创建事件循环等待请求完成
    QEventLoop loop;

    // 连接完成信号
    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);

    // 设置超时定时器
    QTimer timer;
    timer.setSingleShot(true);
    timer.setInterval(timeoutMs); // 超时时间，单位：毫秒

    // 连接超时信号
    QObject::connect(&timer, &QTimer::timeout, [&]() {
        // 超时处理：取消请求并退出事件循环
        reply->abort();
        loop.quit();
    });

    // 启动定时器
    timer.start();

    // 等待请求完成或超时
    loop.exec();

    // 处理结果
    if (timer.isActive())
    {
        // 定时器仍在运行，说明是正常完成，不是超时
        timer.stop();

        if (reply->error() == QNetworkReply::NoError)
        {
            // 读取响应数据
            QByteArray responseData = reply->readAll();

            // 解析JSON
            QJsonParseError parseError;
            QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData, &parseError);

            if (parseError.error == QJsonParseError::NoError)
            {
                if (jsonDoc.isObject())
                {
                    resultObject = jsonDoc.object();
                }
                else
                {
                    // qWarning() << "Response is not a JSON object";
                    resultObject["code"] = -1;
                    resultObject["error"] = "Response is not a JSON object";
                }
            }
            else
            {
                // qWarning() << "JSON parse error:" << parseError.errorString();
                resultObject["code"] = -2;
                resultObject["error"] = "JSON parse error: " + parseError.errorString();
            }
        }
        else
        {
            // 处理网络错误
            // qWarning() << "Network error:" << reply->errorString();
            resultObject["code"] = 404;
            resultObject["error"] = "Network error: " + reply->errorString();
        }
    }
    else
    {
        // 定时器已触发，说明是超时
        // qWarning() << "Request timed out after" << timeoutMs << "ms";
        resultObject["code"] = 404;
        resultObject["error"] = "Request timed out";
    }

    // 清理资源
    reply->deleteLater();
    return resultObject;
}
